package config

import (
	"os"
	"strconv"
	"time"

	"github.com/joho/godotenv"
)

// Config 应用所有配置项（完全从环境变量加载）
type Config struct {
	Server   ServerConfig
	Database DatabaseConfig
	Deepseek DeepseekConfig
	Import   ImportConfig
}

// ServerConfig 服务器配置
type ServerConfig struct {
	Port         int
	ReadTimeout  time.Duration
	WriteTimeout time.Duration
}

// DatabaseConfig 数据库配置
type DatabaseConfig struct {
	Host            string
	Port            int
	User            string
	Password        string
	Name            string
	MaxOpenConns    int
	MaxIdleConns    int
	ConnMaxLifetime time.Duration
}

// DeepseekConfig Deepseek API配置
type DeepseekConfig struct {
	APIURL  string
	APIKey  string
	Timeout time.Duration
}

// ImportConfig 导入配置
type ImportConfig struct {
	BatchSize int
	FilePath  string
}

// Load 从.env文件和环境变量加载配置
func Load() (*Config, error) {
	// 加载.env文件（本地开发用）
	_ = godotenv.Load() // 忽略无.env文件的错误（如容器环境）

	return &Config{
		Server: ServerConfig{
			Port:         getEnvInt("SERVER_PORT", 8080), // 默认8080
			ReadTimeout:  getEnvDuration("SERVER_READ_TIMEOUT", 10*time.Second),
			WriteTimeout: getEnvDuration("SERVER_WRITE_TIMEOUT", 10*time.Second),
		},
		Database: DatabaseConfig{
			Host:            getEnvString("DB_HOST", "host.docker.internal"),
			Port:            getEnvInt("DB_PORT", 3306),
			User:            getEnvString("DB_USER", "root"),
			Password:        getEnvString("DB_PASSWORD", ""), // 无默认，必须在.env中配置
			Name:            getEnvString("DB_NAME", "dictionary"),
			MaxOpenConns:    getEnvInt("DB_MAX_OPEN_CONNS", 20),
			MaxIdleConns:    getEnvInt("DB_MAX_IDLE_CONNS", 10),
			ConnMaxLifetime: getEnvDuration("DB_CONN_MAX_LIFETIME", 300*time.Second),
		},
		Deepseek: DeepseekConfig{
			APIURL:  getEnvString("DEEPSEEK_API_URL", "https://api.deepseek.com/v1/chat/completions"),
			APIKey:  getEnvString("DEEPSEEK_API_KEY", ""), // 无默认，必须在.env中配置
			Timeout: getEnvDuration("DEEPSEEK_TIMEOUT", 30*time.Second),
		},
		Import: ImportConfig{
			BatchSize: getEnvInt("IMPORT_BATCH_SIZE", 1000),
			FilePath:  getEnvString("IMPORT_FILE_PATH", "./data/6 托福-乱序.txt"),
		},
	}, nil
}

// 工具函数：从环境变量获取字符串，支持默认值
func getEnvString(key, defaultValue string) string {
	if val := os.Getenv(key); val != "" {
		return val
	}
	return defaultValue
}

// 工具函数：从环境变量获取整数，支持默认值
func getEnvInt(key string, defaultValue int) int {
	valStr := os.Getenv(key)
	if valStr == "" {
		return defaultValue
	}
	val, err := strconv.Atoi(valStr)
	if err != nil {
		return defaultValue
	}
	return val
}

// 工具函数：从环境变量获取Duration，支持默认值（环境变量格式："10s"、"5m"等）
func getEnvDuration(key string, defaultValue time.Duration) time.Duration {
	valStr := os.Getenv(key)
	if valStr == "" {
		return defaultValue
	}
	val, err := time.ParseDuration(valStr)
	if err != nil {
		return defaultValue
	}
	return val
}
